package schuchert.contest;

import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;

import java.util.ArrayList;
import java.util.Collection;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(Parameterized.class)
public class ConTestInsrumentationMainBasedClassFileTransformerFilterTest {
    ConTestInstrumentationMainBasedClassFileTransformer transformer;

    @Before
    public void setup() {
        transformer = new ConTestInstrumentationMainBasedClassFileTransformer();
    }

    @Parameters
    public static Collection data() {
        ArrayList<Object[]> values = new ArrayList<Object[]>();

        values.add(new Object[] { "", false, false, false, false });
    }

    @Test
    public void withNoFilterEverythingAlwaysPasses() {
        transformer.setFilter("");
        assertIsNotFiltered("com/ibm");
        assertIsNotFiltered("java/io");
        assertIsNotFiltered("schuchert/contest/");

    }

    @Test
    public void onlyExcludeClassesStartingWithJava() {
        transformer.setFilter("-java");
        assertIsNotFiltered("com/ibm");
        assertIsFiltered("java/io");
        assertIsNotFiltered("schuchert/contest/");
    }

    @Test
    public void onlyIncludedClassesStartingWithJava() {
        transformer.setFilter("+java");
        assertIsFiltered("com/ibm");
        assertIsNotFiltered("java/io");
        assertIsFiltered("schuchert/contest/");
    }

    @Test
    public void multipleExclusionsLeaveDefaultRepsonseToTrueIfNoMatchesFound() {
        transformer.setFilter("-java:-com");
        assertIsFiltered("java/io");
        assertIsNotFiltered("schuchert/contest/");
        assertIsFiltered("com/ibm");
    }

    @Test
    public void oneInclusionCausesEverythingNotMatchingToBeExcluded() {
        transformer.setFilter("+java:-schuchert:-ibm:-com");
        assertIsNotFiltered("java/io");
        assertIsFiltered("schuchert/contest/");
        assertIsFiltered("com/ibm");
        assertIsFiltered("ibm");
        assertIsFiltered("foo");
    }

    private void assertIsNotFiltered(String string) {
        assertTrue(transformer.isClassWeShouldProcess(string));
    }

    private void assertIsFiltered(String string) {
        assertFalse(transformer.isClassWeShouldProcess(string));
    }
}
